/*
 *  Driverstack.java
 * 
 * Clase main que implementa a Mistack, para que pormedio de el se pueda ingresar de manera Postfix una expresion y
 * esta se realice segun lo ingresado por el usuario.
 * 
 *  Universidad del Valle de Guatemala            Algoritmos y Estructura de Datos 
 *  Seccion 20
 * Tomado de la  Hoja de trabajo 2
 */


import java.util.Scanner;
import java.util.InputMismatchException;

/**
 * Clase main que implementa a Mistack2, para que pormedio de el se pueda ingresar de manera Postfix una expresion y
 * esta se realice segun lo ingresado por el usuario.
 * @author Alejandro Rojas      Carne 10104
 */
public class Driverstack {
    private static boolean bandera;
    private static Mistack2<Double> operandos = new Mistack2 <Double>(0.0);

    
    /**
     * 
     * @param args
     */
    public static void main(String[] args) {
            
        Scanner teclado = new Scanner(System.in);  
        boolean control= false;
        int opcion;
       double ingresar;
        String ope;
        
        System.out.println("Bienvenido por favor ingrese su expresion en forma Posfix ");
        System.out.println("--------INSTRUCCIONES-----------");
        System.out.println("Primero: ingrese el primer operando");
        System.out.println("Segundo: ingrese el segundo operando");
        System.out.println("Tercero: ingrese el simbolo del operador");
        System.out.println();
        System.out.println();
        
        opcion= 2;
        
            
        do{
         //llamada de metodo menu para mostra el menu en pantalla 
            //-----------------------------------------------------
            
            //-----------------------------------------------------
            switch(opcion){
                case 1:
                       do{
                        bandera = false;
                        System.out.println("Segundo operando");
                        operandos.push(verificar(1));
                       }while(bandera);  
                      procmenu(); 
                break;
                    
                case 2: 
                    if(!(operandos.empty())){
                        do{
                             operandos.pop();
                          }while(!(operandos.empty()));
                     }
                    do{
                            bandera = false;
                            System.out.println("Primer operando");
                            operandos.push(verificar(1));
                         }while(bandera);
        
                    do{
                        bandera = false;
                        System.out.println("Segundo operando");
                        operandos.push(verificar(1));
                       }while(bandera);
         
                     procmenu(); 
                        
                break;
                       
	              default:// si ninguna de las ipciones mostradas anteriormente es elegida se muestra este mensaje de error como default
                    System.out.println("\nERROR: ~~> Opcion invalida.\n"); 
             
                      
            }
                    menu();
                    opcion = (int)verificar(0);
            
                         if (opcion < 0)
                         opcion = 0;  
        }while(opcion!=3);
        
        System.out.println("Fin de uso de programa buen dia "); 
        
        
        // TODO code application logic here
    }
     /**
     * metodo menu que permite enviar a pantalla las opciones disponibles de manera creativa
     * acerca de que puede realizar el usuario.
     */
    public static void menu(){
        System.out.println();
        System.out.println("+--          MENU DE OPCIONES             --+");
        System.out.println("| 1.   Continuar con la operacion anterior  |");
        System.out.println("| 2.   Nueva operacion                      |");
        System.out.println("| 3.   Salir  Programa                      |");
    }
    /**
     * metodo menu2 que permite enviar a pantalla las opciones disponibles de manera creativa sobre que operacion matematica
     * realizar, segun los operandos ingresados
     */
    public static void menu2(){
        System.out.println();
        System.out.println("+-- MENU  DE OPERACIONES  --+");
        System.out.println("| 1.   Suma                 |");
        System.out.println("| 2.   Resta                |");
        System.out.println("| 3.   Multiplicacion       |");
        System.out.println("| 4.   Division             |");
    }
     
    /**
     * Metodo verificar permite el ingreso de por teclado de cualquier escrito pero
     * verifica si ese escrito es un numero, si es un numero entonces no hay error, sin importar si es real o entero
     * pero si no es un numero entonces se muestra un mensaje de error.
     * @param op parametro que permite determinar que mensaje mostrar en pantalla al momento de solicitar 
     * un ingreso, puede solicitar el mensaje de una opcion o un boton
     * @return devuelve un valor real double
     */
    public static double verificar(int op){
        Scanner ingreso = new Scanner(System.in);
        double num = -1;
	if(op == 0)
			System.out.println("Ingrese su opcion por favor");
        if (op ==1)
                        System.out.println("Ingrese valor de operando ");
        try{
            num = ingreso.nextDouble();
        }
        catch(InputMismatchException exception){
                System.out.println("\nERROR: ~~> Dato invalido. ingrese un numero\n");
                bandera = true;
        }
        finally{
            ingreso.nextLine();//Atrapar el ENTER
        }
        return num;
    }
    /**
     * Metodo que permite elegir una de las operaciones matematicas mostradas por el menu2, que se realizaran con los operandos
     * ingresados, ademas la respuesta es guardada en la pila.
     */
    public static void procmenu(){
        int opcion;
         double operando1,operando2,respuesta;
            do{
                         bandera = true;
                         menu2(); 
                         opcion = (int)verificar(0);
            
                         if (opcion < 0)
                         opcion = 0;
                         switch(opcion){
                                 case 1:
                                     operando2 = operandos.pop();
                                     operando1 = operandos.pop();
                                     respuesta = operando2 + operando1;
                                     operandos.push(respuesta);
                                     System.out.println("La respueta es "+ respuesta); 
                                     bandera = false;
                                  break;
                                  case 2:
                                     operando2 = operandos.pop();
                                     operando1 = operandos.pop();
                                     respuesta = operando1 - operando2;
                                     operandos.push(respuesta);
                                     System.out.println("La respueta es "+ respuesta);  
                                     bandera = false;
                                  break;
                                  case 3:
                                     operando2 = operandos.pop();
                                     operando1 = operandos.pop();
                                     respuesta = operando2 * operando1;
                                     operandos.push(respuesta);
                                     System.out.println("La respueta es "+ respuesta);
                                     bandera = false;
                                  break;
                                  case 4:
                                     operando2 = operandos.pop();
                                     operando1 = operandos.pop();
                                     respuesta = operando1 / operando2;
                                     operandos.push(respuesta);
                                     System.out.println("La respueta es "+ respuesta);  
                                     bandera = false;
                                  break;
                                    default:// si ninguna de las ipciones mostradas anteriormente es elegida se muestra este mensaje de error como default
                                           System.out.println("\nERROR: ~~> Opcion invalida.\n"); 
                         }
                       }while(bandera);  
                            }
}
